
/*
 * Copyright (C) Zhu Jiashun
 * Copyright (C) Zaver
 */

#ifndef THREADPOOL_H
#define THREADPOOL_H

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdint.h>
#include "dbg.h"

#define THREAD_NUM 8 // 最大线程数

    // 任务
    typedef struct zv_task_s
    {
        void (*func)(void *); // 回调函数
        void *arg;            // 函数参数
        struct zv_task_s *next;
    } zv_task_t;

    // 线程池
    typedef struct
    {
        pthread_mutex_t lock; // 锁
        pthread_cond_t cond;  // 条件变量
        pthread_t *threads;   // 线程数组
        zv_task_t *head;      // 任务列表
        int thread_count;     // 线程数量
        int queue_size;       // 队列大小
        int shutdown;         // 关闭
        int started;          // 开始
    } zv_threadpool_t;

    typedef enum
    {
        zv_tp_invalid = -1,
        zv_tp_lock_fail = -2,
        zv_tp_already_shutdown = -3,
        zv_tp_cond_broadcast = -4, // 条件变量广播
        zv_tp_thread_fail = -5,

    } zv_threadpool_error_t; // 线程池状态

    zv_threadpool_t *threadpool_init(int thread_num); // 初始化

    int threadpool_add(zv_threadpool_t *pool, void (*func)(void *), void *arg); // 添加任务

    int threadpool_destroy(zv_threadpool_t *pool, int gracegul); // 销毁

#ifdef __cplusplus
}
#endif

#endif
